package com.leetcode.HW;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

/**
 * @author lzf
 * @date 2024/12/4
 * 提取字符串中的最长合法简单数学表达式字符串长度最长的，并计算表达式的值。如果没有返回 0
 * 简单数学表达式只能包含以下内容
 * 0-9 数字，符号+-*
 * 说明:
 * 1.所有数字，计算结果都不超过 long
 * 2.如果有多个长度一样的，请返回第一个表达式的结果
 * 3.数学表达式，必须是最长的，合法的
 * 4.操作符不能连续出现，如 +--+1 是不合法的
 * 输入描述 字符串
 * 输出描述 表达式值 示例一
 * 输入
 * 1-2abcd
 * 输出
 * -1
 */
public class HW最长合法表达式 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        // 将不是数字或不是+*-三个操作符作为条件分割，得到一个个表达式
        String[] split = str.split("[^0-9+*-]+");
        int max = 0;
        String computeStr = "";
        long result = 0;
        for (String s : split) {
            // 判断表达式是否合法 ()* 表示括号内的组合可以0个或多个
            if (!s.matches("(\\d+[+*-])*\\d+")) {
                continue;
            }
            if (s.length() > max) {
                max = s.length();
                computeStr = s;
            }
        }
        if (max == 0) {
            System.out.println(0);
            return;
        }
        // 到这里，computeStr就是合法的表达式，下面按照合法的表达式去做
        Stack<Long> num = new Stack<>();
        Stack<String> operator = new Stack<>();
        // 分割操作数和操作符
        String[] nums = computeStr.split("[+*-]");
        String[] operators = computeStr.split("\\d+");
        // 倒叙入栈
        for (int i = nums.length - 1; i >= 0;i--) {
            num.push(Long.parseLong(nums[i]));
        }
        // 合法的表达式，分割之后，operators第一个是空串，忽略掉(i > 0)
        for (int i = operators.length - 1; i > 0; i--) {
            operator.push(operators[i]);
        }
        // 滑动窗口，保证 两个操作数和一个操作符
        result = num.pop();
        String o = operator.pop();
        long num2 = num.pop();
        while (!num.isEmpty()) {
            if ("*".equals(o)) {
                result = calc(o, result, num2);
                o = operator.pop();
                num2 = num.pop();
            } else {
                String o1 = operator.pop();
                long num3 = num.pop();
                if ("*".equals(o1)) {
                    num2 = calc(o1, num2, num3);
                } else {
                    result = calc(o, result, num2);
                    o = o1;
                    num2 = num3;
                }
            }
        }
        result = calc(o, result, num2);
        System.out.println(result);
    }
    public static long calc(String o, long num1, long num2) {
        switch (o) {
            case "-":
                return num1 - num2;
            case "+":
                return num1 + num2;
            case "*":
                return num1 * num2;
            default:
                return 0;
        }
    }
}
